package com.example.sxt_practise.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 通过反射,动态创建对象
 * @author gaofeng
 * date 2022年03月06日 17:36
 */
public class Test2 {
    public static void main(String[] args) {
        try {
            // 本质是: 调用无参构造器,且权限要足够
            /**
             * 对象是表示或封装一些数据,一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构会被放到对应的Class对象中,这个Class对象就像一面镜子一样,通过他我们可以看到对应类的全部信息
             */
            Class aClass = Class.forName("Student");
            Student stu = (Student) aClass.newInstance();
            System.out.println(stu);

            // 通过构造器创建对象
            Constructor constructor = aClass.getDeclaredConstructor(int.class, String.class, String.class);
            Student stu2 = (Student) constructor.newInstance(1, "高枫", "高一");
            System.out.println(stu2);

            // 通过反射调用普通方法
            Student stu3 = (Student) aClass.newInstance();
            Method setName = aClass.getDeclaredMethod("setName", String.class);
            Method[] methods = aClass.getMethods();
            // 激活
            setName.invoke(stu3, "小罗") ;
            System.out.println(stu3.getName());

            // 通过反射操作属性
            Student stu4 = (Student) aClass.newInstance();
            Field name  = aClass.getDeclaredField("name");
            // 访问安全检查的开关
            name.setAccessible(true);
            name.set(stu4, "一辈子");
            System.out.println(stu4.getName());

        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException | NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}
